home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 10 / 9 / DISK1095.ZIP / EXPMNT.PRG < prev    next >
Text File  |  1986-10-06  |  13KB  |  375 lines

  1. *
  2. * EXPMNT
  3. * CREATE AND MAINTAIN JOB HISTORY FILE FOR EMPLOYEES AND APPLICANTS
  4. * SUPPORTS HIERARCHICAL FILE STRUCTURES: HEADER-LINE, PARENT-CHILD, ETC.
  5. * FILE STRUCTURE MUST ALREADY EXIST
  6. SET HEADING OFF
  7. SET SAFETY OFF
  8. SET STATUS OFF
  9. CLEAR
  10. CLEAR ALL
  11. SET TALK OFF
  12. SET BELL OFF
  13. * DEFINE A STRING OF BLANKS
  14. STORE SPACE(80) TO BLANK
  15. * CLEAR REQUEST AND ACTION CONTROL VARIABLES
  16. STORE " " TO REQUEST
  17. STORE " " TO ACTION
  18. *
  19. *===============================START MODS: 1================================*
  20. * SET NAME OF PRIMARY (PARENT) FILE                                          *
  21. STORE "PERSONNL" TO FILENAME
  22. * SET NAME OF SECONDARY (CHILD) FILE
  23. STORE "EXPHIST" TO LINKNAME
  24. * SETUP COUNT OF INDEXES FOR THE FILE filename
  25. STORE 2 TO IXCOUNT
  26. * SETUP CONSTANTS CONTAINING INDEXES IN SEQUENCE TO USE IN MACRO LATER.
  27. * LIST EACH INDEX FIRST AS A PRIMARY INDEX. VARIABLES NAMED IXA, IXB, IXC, ETC.
  28. STORE "PNAME,PSSAN" TO IXA
  29. * DEFINE KEYS FOR INDEX. IF NUMERIC, MUST CONVERT WITH STR(). USE DI+IXA, ETC.
  30. STORE "LAST_NAME-','-FIRST_NAME" TO DIIXA
  31. STORE "PSSAN,PNAME" TO IXB
  32. STORE "A->SSAN" TO DIIXB
  33. * DEFINE KEY WHICH LINKS PARENT AND CHILD RECORDS DEFINED IN TERMS OF PARENT
  34. * FILE FIELDS.
  35. STORE "A->SSAN" TO DIPARENT
  36. * DEFINE CORRESPONDING KEY IN TERMS OF PARENT RECORD FIELDS
  37. * CHILD FILE INDEXING ONLY POSSIBLE IN PRESENCE OF PARENT
  38. STORE "SSAN" TO DILINK
  39. * STORE NAME OF CHILD FILE DATA ELEMENT TO CONTAIN THE LINKING KEY VALUE
  40. STORE "SSAN" TO LINKKEY
  41. * SETUP NAME OF INDEX FILE FOR THE LINKED FILE. MUST NOT BE SAME NAME AS A
  42. * PARENT FILE INDEX
  43. STORE "LPSSAN" TO IXLINK
  44. *==================================END MODS==================================*
  45. *
  46. * SAVE NAME OF MACRO WHICH CONTAINS ACTIVE INDEX AS FIRST INDEX
  47. STORE "IXA" TO LIVE_IX
  48. * OPEN FILE WITHOUT INDEXES TO FIND RECORD COUNT
  49. USE &FILENAME
  50. COUNT TO RECCNT
  51. **OPEN LINKED FILE WITHOUT INDEXES TO FIND RECORD COUNT
  52. SELECT B
  53. USE &LINKNAME
  54. COUNT TO LINKCNT
  55. STORE "N" TO DATAIN
  56. * IF FILE IS EMPTY, ASSUME INDEXES NOT CREATED AND CREATE THEM
  57. SELECT A
  58.    STORE 1 TO COUNT
  59.    DO WHILE COUNT<=IXCOUNT
  60.       STORE "IX"+CHR(64+COUNT) TO TEMP
  61.       STORE "DI"+TEMP TO TEMP2
  62.       IF IXCOUNT>1
  63.          STORE SUBSTR(&TEMP,1,AT(",",&TEMP)-1) TO TEMP
  64.       ELSE
  65.          STORE &TEMP TO TEMP
  66.       ENDIF
  67.       STORE &TEMP2 TO TEMP2
  68.       INDEX ON &TEMP2 TO &TEMP
  69.       STORE COUNT+1 TO COUNT
  70.    ENDDO
  71. * ADD INDEXES
  72. SET INDEX TO &IXA
  73. * POSITION AT FIRST RECORD IN LIVE INDEX SEQUENCE FOR INITIAL DISPLAY
  74. GO TOP
  75. * IF LINK FILE IS EMPTY, ASSUME INDEX NOT CREATED AND CREATE IT
  76. SELECT B
  77.    INDEX ON &DILINK TO &IXLINK
  78. * ADD INDEX FOR LINKED FILE
  79. SET INDEX TO &IXLINK
  80. * POSITION LINKED FILE AT FIRST CHILD RECORD MATCHING KEY IN PARENT
  81. SEEK DIPARENT
  82. *
  83. * MAIN UPDATE LOOP. TERMINATED BY 'M' AS REQUEST
  84. DO WHILE REQUEST<>"M"
  85. *  CLEAR RECORD DISPLAY AREA. TO SAVE TIME, COULD CLEAR ONLY LINES WITH
  86. *  FIELDS FROM CHILD FILE
  87.    STORE 16 TO COUNT
  88.    DO WHILE COUNT<19
  89.       @ COUNT,0 SAY BLANK
  90.       STORE COUNT+1 TO COUNT
  91.    ENDDO
  92. *
  93. *===============================START MODS: 2================================*
  94. * DISPLAY SCREEN MASK: HEADING INFORMATION PLUS LABELS FOR EACH FIELD        *
  95.    @ 1,22 SAY "SMITH'S BIKEWORKS INFORMATION SYSTEM"
  96.    @ 3,11 SAY ">> Human Resources Management System File Maintenance <<"
  97.    @ 5,17 SAY "Today's Date:"
  98.    ?? DATE()
  99. * SETUP VARIABLE PART OF MASK
  100.    SELECT A
  101. * ALL FOLLOWING FIELDS ARE FROM PARENT FILE
  102.    @ 7,1  SAY "EMPLOYEE ? " GET HIRED
  103.    @ 7,60 SAY "SSAN " GET SSAN
  104.    @ 8,1 SAY "Name--Last  " GET LAST_NAME
  105.    @ 8,36 SAY "First " GET FIRST_NAME
  106.    @ 8,60 SAY "Initial " GET INITIAL
  107.    @ 9,1  SAY "Street " GET STREET
  108.    @ 9,36 SAY "City " GET CITY
  109.    @ 9,59 SAY "State" GET STATE
  110.    @ 9,69 SAY "Zip " GET ZIP
  111.    @ 11,1  SAY "Education " GET   GRADE_SCHL
  112.    @ 11,30 SAY "College " GET   COLLEGE
  113.    @ 11,45 SAY "Phys Limits " GET   PHYS_LIMIT
  114.    @ 12,1  SAY "Sex " GET   SEX
  115.    @ 12,10 SAY "Marital Status " GET   MAR_STATUS
  116.    @ 12,31 SAY "Birth Date " GET   BIRTH_DATE PICTURE "99/99/99"
  117.    @ 13,1 SAY "Hourly ? " GET   HOURLY
  118.    @ 13,14 SAY "Rate/Salary " GET   PAY_RATE
  119.    @ 13,36 SAY "Overtime Factor " GET   OVER_TIME
  120.    @ 13,59 SAY "Exemptions " GET   EXEMP
  121.    @ 14,1  SAY "Year to Date -- Pay $"
  122.    ?? A->YTD_PAY
  123.    @ 14,35 SAY "Withholding $"
  124.    ?? A->YTD_WTHHLD
  125.    @ 14,60 SAY "FICA $"
  126.    ?? A->YTD_FICA
  127. *============================================================================
  128. *
  129. * ONLY CHILD RECORDS MAY BE ADDED OR EDITED
  130.    CLEAR GETS
  131. * SEE IF KEYS MATCH IN PARENT AND CHILD. IF NOT, TRY FIND ON SECONDARY FILE
  132.    IF REQUEST = "<"
  133.       SELECT B
  134.       GO TOP
  135.    ENDIF
  136.    SELECT B
  137.    IF (EOF() .OR. BOF()).OR.REQUEST<>"A".AND.A->SSAN<>B->SSAN
  138.       STORE A->SSAN TO TEMP
  139.       SEEK TEMP
  140.    ENDIF
  141. *
  142. *================================START MODS: 3===============================*
  143. *
  144. * DISPLAY CHILD RECORD ONLY IF THERE IS ONE THAT MATCHES PARENT
  145. * FIELDS RETRIEVED ARE FROM THE CHILD (SECONDARY) FILE
  146.    IF .NOT. (EOF() .OR. BOF())
  147.       @ 16,1  SAY "Work Code " GET   WORK_CODE
  148.       @ 16,19 SAY "Title " GET   WORK_TITLE
  149.       @ 16,49 SAY "Start " GET   START_DATE PICTURE "99/99/99"
  150.       @ 16,65 SAY "End "   GET   END_DATE PICTURE "99/99/99"
  151.       @ 17,1  SAY "By" GET   EMP_NAME
  152.       @ 17,26 SAY "Strt" GET   EMP_STREET
  153.       @ 17,52 SAY "City" GET   EMP_City
  154.       @ 17,73 SAY "St" GET   EMP_STATE
  155.    ENDIF
  156. * DATE OF LAST UPDATE SHOULD BE ONE OF THE FIELDS (LAST_UPDT)
  157. * BOTH PARENT AND CHILD FILES WILL BE ASSUMED TO CONTAIN LAST_UPDT FIELDS
  158.    @ 18,1 SAY "Last Updated : "
  159.    ?? A->LAST_UPDT, B->LAST_UPDT
  160. *==================================END MODS==================================*
  161. *
  162. * DISPLAY VARIABLE DATA IN SCREEN HEADING
  163.    IF DELETE()
  164.       @ 5,1 SAY "* DELETED *"
  165.    ELSE
  166.       @ 5,1 SAY "           "
  167.    ENDIF
  168. * IDENTIFY RECORD
  169. * USE PARENT RECORD RECORD NUMBER
  170.    SELECT A
  171.     @ 5,43 SAY "Record"
  172.     @ 5,50 SAY RECNO()
  173.     @ 5,62 SAY "of"
  174.     @ 5,64 SAY RECCNT
  175. * NOW MAKE SECONDARY FILE ACTIVE, SINCE EDITING OPERATIONS WILL BE ON THIS FILE
  176.    SELECT B
  177. * IF DATAIN FLAG SET, ACTIVATE THE GETS
  178.    IF DATAIN="Y"
  179.       @ 19,72 GET ACTION
  180.       READ
  181. * DATE STAMP CHILD RECORD
  182.       REPLACE LAST_UPDT WITH DATE()
  183.       IF REQUEST="E".OR.ACTION<>"C"
  184.          STORE "N" TO DATAIN
  185.          STORE " " TO REQUEST
  186.          STORE " " TO ACTION
  187.       ENDIF 2
  188.    ELSE
  189.       CLEAR GETS
  190.    ENDIF 1
  191. *
  192. * DISPLAY CONTROL SUBMENU, CURRENT ACTIVE INDEX
  193.    @ 19,0 SAY BLANK
  194.    @ 20,0 SAY "----------------------------------------"
  195.    @ 20,40 SAY "----------------------------------------"
  196.    @ 21,0 CLEAR
  197.    @ 21,2 SAY ;
  198. "<F>ind Record  <A>dd Record   <D>elete/Recall  <E>dit Record   Current Active"
  199.    @ 22,2 SAY ;
  200. "<P>rev Record  <N>ext Record  <M>enu (return)  <K>ey Select    Key:          "
  201.    @ 23,2 SAY ;
  202. "< prev, next linked record >"
  203. * IF INDEX SET NAMED IN LIVE_IX HAS MULTIPLE ENTRIES, EXTRACT FIRST
  204.    IF (","$&LIVE_IX)
  205.       STORE SUBSTR(&LIVE_IX,1,AT(",",&LIVE_IX)-1) TO TEMP
  206.       @ 22,70 SAY TEMP
  207.    ELSE
  208.       @ 22,70 SAY &LIVE_IX
  209.    ENDIF
  210. * GET REQUEST AND FORCE TO UPPER CASE UNLESS ALREADY IN 'A' FOR ADD RECORDS
  211.    IF REQUEST<>"A"
  212.       STORE " " TO REQUEST
  213.       STORE " " TO ACTION
  214.       @ 23,35 SAY "*** NEXT ACTION TO PERFORM " GET REQUEST
  215.       READ
  216.       STORE UPPER(REQUEST) TO REQUEST
  217.    ENDIF
  218. * CLEAR ADD RECORD COMMAND LINE, SUBMENU AREA
  219.    @ 21,0 CLEAR
  220.    DO CASE
  221. * ADD NEW CASE OR EDIT DISPLAYED CASE
  222.       CASE REQUEST="A".OR.REQUEST="E"
  223. * WILL ADD CHILD RECORD. CAN ONLY ADD IF THERE IS AT LEAST ONE PARENT
  224.          IF RECCNT>0
  225.             SELECT B
  226. * IN ADD MODE, APPEND A BLANK RECORD FOR THE DATA AND POSITION TO THAT RECORD
  227.             IF REQUEST="A"
  228.                @ 19,6 SAY "*** PRESS 'C' TO CONTINUE ADDING NEW RECS, ANYTHING;
  229.  ELSE TO QUIT"
  230.                APPEND BLANK
  231.                STORE LINKCNT+1 TO LINKCNT
  232.                GO LINKCNT
  233. * SETUP PARENT RECORD KEY VALUE IN CHILD RECORD
  234.                REPLACE &LINKKEY WITH &DIPARENT
  235.             ELSE
  236.                @ 19,6 SAY "******** PRESS ANY KEY TO FINISH EDIT AND RETURN TO;
  237.  SUBMENU     "
  238.             ENDIF
  239.            @ 21,10 SAY "Enter data at cursor position. Move among fields with"
  240.            @ 22,10 SAY "cursor control keys. Press ENTER to move to next field"
  241.            @ 23,10 SAY "Press ENTER alone to leave field unchanged."
  242. * SET FLAG TO CAUSE NEW DATA TO BE READ
  243.             STORE "Y" TO DATAIN
  244.          ENDIF
  245. * TOGGLE DELETE FLAG. * FUNCTION CHECKS IF RECORD NOW FLAGGED AS DELETED
  246.       CASE REQUEST="D"
  247.          IF DELETE()
  248.             RECALL
  249.          ELSE
  250.             DELETE
  251.          ENDIF
  252. * PREVIOUS RECORD IN ACTIVE INDEX SEQUENCE
  253.       CASE REQUEST="P"
  254.          SELECT A
  255.          SKIP -1
  256. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  257.          IF BOF()
  258.             GO BOTTOM
  259.          ENDIF
  260.          SELECT B
  261. * NEXT RECORD IN ACTIVE INDEX SEQUENCE
  262.       CASE REQUEST="N"
  263.          SELECT A
  264.          SKIP +1
  265. * NEXT THREE LINES SECURE THE FOWARD LOOP
  266.          IF EOF()
  267.             GO TOP
  268.          ENDIF
  269.          SELECT B
  270. * PREVIOUS CHILD RECORD IN ACTIVE INDEX SEQUENCE
  271.       CASE REQUEST="<"
  272. * SAVE CURRENT LOCATION TO SEE IF AT BEGINNING
  273.          STORE RECNO() TO RECNOW
  274. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  275.          IF BOF()
  276.             GO BOTTOM
  277.          ELSE
  278.             SKIP -1
  279.          ENDIF
  280. * IF PARENT AND CHILD DON'T MATCH, OR AT BEGINNING OF CHILD FILE, BACKUP PARENT
  281.          IF A->SSAN<>B->SSAN.OR.BOF()
  282.             SELECT A
  283.             SKIP -1
  284. * NEXT THREE LINES SECURE THE BACKWARD LOOP
  285.             IF BOF()
  286.                GO BOTTOM
  287.             ENDIF
  288.             SELECT B
  289.          ENDIF
  290. * NEXT CHILD RECORD IN ACTIVE INDEX SEQUENCE
  291.       CASE REQUEST=">"
  292. * SAVE CURRENT LOCATION TO SEE IF AT BEGINNING
  293.          STORE RECNO() TO RECNOW
  294. * NEXT THREE LINES SECURE THE FOWARD LOOP
  295.          IF EOF()
  296.             GO TOP
  297.          ELSE
  298.             SKIP +1
  299.          ENDIF
  300. **IF PARENT AND CHILD DON'T MATCH, OR AT END OF CHILD FILE, ADVANCE PARENT
  301.          IF A->SSAN<>B->SSAN
  302.             SELECT A
  303.             SKIP +1
  304. * NEXT THREE LINES SECURE THE FOWARD LOOP
  305.             IF EOF()
  306.                GO TOP
  307.             ENDIF
  308.             SELECT B
  309.          ENDIF
  310. * GET SEARCH VALUE FOR INDEXED SEARCH
  311.       CASE REQUEST="F"
  312.          SELECT A
  313. * USE MACRO DEFINING INDEX ENTRIES FROM DATA FIELDS
  314.          STORE "DI"+LIVE_IX TO IXDEF
  315.          STORE &IXDEF TO SV
  316.          STORE &SV TO SV
  317.          @ 21,1 SAY ;
  318.          "ENTER SEARCH VALUE. VALUE SHOWN IS FROM THE DISPLAYED RECORD. PRESS"
  319.          @ 22,1 SAY "CTRL-Y TO CLEAR " GET SV
  320.          READ
  321. * REMOVE TRAILING BLANKS BEFORE SEARCH
  322.          STORE TRIM(SV) TO SEARCH
  323. * IF RECORD IS NOT FOUND POSITION STAYS AT CURRENT RECORD
  324. * FIND IS IN PARENT FILE
  325.          SELECT A
  326. * NEXT LINE KEEPS TRACK OF CURRENT RECNO() FOR TEST BELOW
  327.          STORE RECNO() TO NOW
  328.          SEEK SEARCH
  329. * NEXT 3 LINES KEEP PRESENT RECORD DISPLAYED IF NO FIND.
  330.          IF EOF()
  331.             GOTO NOW
  332.          ENDIF
  333.          SELECT B
  334. * CHANGE INDEX
  335.       CASE REQUEST="K"
  336. * MUST POINT TO PARENT FILE WHILE INDEX IS CHANGED
  337.          SELECT A
  338.          STORE RECNO() TO RECNOW
  339.          STORE " " TO IXCHOICE
  340. * SETUP MENU OF INDEX NAMES, PROVIDE IF CLAUSE FOR EACH INDEX                *
  341.          @ 21,9 SAY " "
  342.          STORE 1 TO COUNT
  343.          DO WHILE COUNT<=IXCOUNT
  344.             STORE "IX"+CHR(64+COUNT) TO TEMP
  345.             IF IXCOUNT>1
  346.                ?? CHR(64+COUNT)+". "+SUBSTR(&TEMP,1,AT(",",&TEMP)-1)+" "
  347.             ELSE
  348.                ?? CHR(64+COUNT)+". "+&TEMP
  349.             ENDIF
  350.             STORE COUNT+1 TO COUNT
  351.          ENDDO
  352.          @ 22,10 SAY "Press letter of desired key " GET IXCHOICE
  353.          READ
  354.          STORE UPPER(IXCHOICE) TO IXCHOICE
  355.          IF IXCHOICE>="A".AND.IXCHOICE<=CHR(64+IXCOUNT)
  356.             STORE "IX"+IXCHOICE TO LIVE_IX
  357.             STORE &LIVE_IX TO TEMP
  358.             SET INDEX TO &TEMP
  359.          ENDIF
  360. * GOTO THIS RECORD TO ACTIVATE INDEX
  361.          IF RECNOW>0
  362.             GO RECNOW
  363.          ELSE
  364.             GO BOTTOM
  365.          ENDIF
  366. * MAKE SECONDARY FILE ACTIVE AGAIN
  367.          SELECT B
  368.    ENDCASE
  369. ENDDO
  370. * FALL OUT OF DO WHEN 'M' IS REQUEST, RETURN TO SUBSYSTEM'S MENU
  371. CLEAR
  372. RETURN
  373.  
  374.  
  375.